//package cn.bonoon.kernel.support;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//import cn.bonoon.kernel.query.Pageable;
//import cn.bonoon.kernel.support.models.AjaxNode;
//import cn.bonoon.kernel.support.models.Item;
//import cn.bonoon.kernel.support.models.Node;
//import cn.bonoon.kernel.support.models.Page;
//import cn.bonoon.kernel.util.StringHelper;
//
///**
// * <pre>
// * 标准的查询对象
// * 扩展自动转值的查询对象为{@link ExtendFinder}
// * </pre>
// * @author jackson
// *
// */
//public class StandardFinder implements Finder{
//	public boolean allowAppendOrder = true;
//	public final StringBuilder from, where, orderby;
//	public final List<Object> parameters;
//	public Pageable pageable;
//	protected final ProxyEntityManager manager;
//	protected FinderHandler handler;
//	private final Map<String, String> cached = new HashMap<String, String>();
//	
//	public StandardFinder(ProxyEntityManager manager){
//		this.manager = manager;
//		this.orderby = new StringBuilder();
//		this.where = new StringBuilder();
//		this.from = new StringBuilder();
//		this.parameters = new ArrayList<Object>();
//	}
//	
//	public void setHandler(FinderHandler handler) {
//		this.handler = handler;
//	}
//	
//	public void setPageable(Pageable pageable) {
//		this.pageable = pageable;
//	}
//	
//	public String join(String pr, String jo){
//		String pn = pr + '.' + jo;
//		String pv = cached.get(pn);
//		if(null == pv){
//			pv = "x_" + cached.size();
//			cached.put(pn, pv);
//			from.append(",").append(pn).append(" left join ").append(pv);
//		}
//		return pv;
//	}
//
//	/**
//	 * 如果是可排序的,则第一个排序的方式是按x.ordinal进行排序,后面再追加排序字段,则只能在x.ordinal相同里二次排序
//	 * @param sn
//	 * @param on
//	 */
//	@Override
//	public Finder order(String sn, String on) {
//		internalOrder(sn, on);
//		return this;
//	}
//	
//	public void internalOrder(String sn, String on) {
//		if (allowAppendOrder && !StringHelper.isEmpty(sn)){
//			orderby.append(orderby.length() > 0 ? ",x." : " x.").append(sn).append("desc".equalsIgnoreCase(on) ? " desc" : " asc");
//		}
//	}
//	
//	@Override
//	public List<Item> items() {
//		return __items(DEFAULT_SELECT_FIELDS);
//	}
//
//	@Override
//	public List<Item> items(String selectFields) {
//		return __items(selectFields);
//	}
//
//	public List<Item> __items(String selectFields) {
//		String ql = __merge(new StringBuilder("select new ").append(Item.class.getName()).append("(").append(selectFields).append(") ")).toString();
//		return manager.resultList(Item.class, ql, parameters);
//	}
//	
//	private StringBuilder __merge(StringBuilder ql){
//		ql.append(from).append(where);
//		if(orderby.length() > 0){
//			ql.append(" order by ").append(orderby);
//		}
//		return ql;
//	}
//
//	@Override
//	public List<Node> nodes() {
//		return __treeNodes(DEFAULT_SELECT_FIELDS);
//	}
//
//	@Override
//	public List<Node> nodes(String selectFields) {
//		return __treeNodes(selectFields);
//	}
//
//	public List<Node> __treeNodes(String selectFields) {
//		List<Node> nodes = __nodes(selectFields);
//		//组织成树形结构
//		Map<String, Node> tree = new HashMap<String, Node>();
//		for(Node node : nodes){
//			tree.put(node.getId(), node);
//		}
//		return __nodes(nodes, tree);
//	}
//
//	private List<Node> __nodes(String selectFields) {
//		String ql = __merge(new StringBuilder("select new ").append(Node.class.getName()).append("(").append(selectFields).append(",x.parent.id) ")).toString();
//		List<Node> nodes = manager.resultList(Node.class, ql, parameters);
//		//整理一下，生成树
//		Map<String, Node> maps = new HashMap<String, Node>();
//		for(Node node : nodes){
//			maps.put(node.getId(), node);
//		}
//		return __nodes(nodes, maps);
//	}
//
//	@Override
//	public List<AjaxNode> ajaxNodes() {
//		return ajaxNodes(DEFAULT_SELECT_FIELDS);
//	}
//
//	@Override
//	public List<AjaxNode> ajaxNodes(String selectFields) {
//		return ajaxNodes(selectFields);
//	}
//
//	public List<AjaxNode> __ajaxNodes(String selectFields) {
//		String ql = __merge(new StringBuilder("select new ").append(AjaxNode.class.getName()).append("(").append(selectFields).append(",x.size) ")).toString();
//		return manager.resultList(AjaxNode.class, ql, parameters);
//	}
//	
//	protected String internalSelect(){
//		return internalSelect(selectField());
//	}
//	
//	protected String internalSelect(String fields){
//		return __merge(new StringBuilder("select ").append(fields)).toString();
//	}
//	
//	protected String inernalCount(){
//		return new StringBuilder("select count(x)").append(from).append(where).toString();
//	}
//
//	protected String selectField(){
//		return "x";
//	}
//	
//	protected List<Object> __query(){
//		return manager.resultList(internalSelect(), parameters);
//	}
//
//	@Override
//	public List<Object> getList() throws Exception {
//		return __handler(__query());	
//	}
//	
//	/**
//	 * 在子类中可以被重写
//	 * @param query
//	 * @return
//	 * @throws Exception 
//	 */
//	protected List<Object> __handler(List<Object> rls) throws Exception{
//		return __handler0(rls);
//	}
//	
//	private List<Object> __handler0(List<Object> rls){
//		if(handler == null){
//			return rls;
//		}
//		List<Object> items = new ArrayList<Object>();
//		for(Object rl : rls){
//			Object it = handler.doHandler(rl, rl);
//			if(null != it){
//				items.add(it);
//			}
//		}
//		return items;
//	}
//	
//	@Override
//	public List<Object> getList(String fields) {
//		return __handler0(manager.resultList(internalSelect(fields), parameters));
//	}
//
//	@Override
//	public Page getPage() throws Exception {
//		if(null == pageable){
//			return new Page(__handler(__query()));
//		}
//		Page page = manager.resultPage(internalSelect(), inernalCount(), pageable, parameters);
//		return page.convert(__handler(page.getRows()));
//	}
//	
//	public void internalAnd(String pre, String name, String opt, Object value){
//		where.append(" and ").append(pre).append('.').append(name).append(opt);
//		parameters.add(value);
//	}
//	
//	public void internalAnd(String name, String opt, Object value){
//		where.append(" and x.").append(name).append(opt);
//		parameters.add(value);
//	}
//	
//	public void internalNull(String name){
//		where.append(" and x.").append(name).append(" is null");
//	}
//	
//	public void internalNull(String pre, String name){
//		where.append(" and ").append(pre).append('.').append(name).append(" is null");
//	}
//
//	@Override
//	public Finder and(String and) {
//		where.append(" and ").append(and);
//		return this;
//	}
//
//	@Override
//	public Finder and(String and, Object para) {
//		parameters.add(para);
//		return and(and);
//	}
//	
//	@Override
//	public Finder and(String and, Object para, Object para2) {
//		parameters.add(para);
//		parameters.add(para2);
//		return and(and);
//	}
//
//	@Override
//	public Finder and(String and, Object... paras) {
//		for(int i = 0; i < paras.length; i++){
//			parameters.add(paras[i]);
//		}
//		return and(and);
//	}
//
//	@Override
//	public Finder or(String or) {
//		where.append(" or ").append(or);
//		return this;
//	}
//
//	@Override
//	public Finder or(String or, Object para) {
//		parameters.add(para);
//		return or(or);
//	}
//
//	@Override
//	public Finder or(String or, Object... paras) {
//		for(int i = 0; i < paras.length; i++){
//			parameters.add(paras[i]);
//		}
//		return or(or);
//	}
//
//	@Override
//	public List<Item> items(ItemSelectedFilter filter) {
//		return __items(DEFAULT_SELECT_FIELDS, filter);
//	}
//
//	@Override
//	public List<Item> items(String selectFields, ItemSelectedFilter filter) {
//		return __items(selectFields, filter);
//	}
//
//	public List<Item> __items(String selectFields, ItemSelectedFilter filter) {
//		List<Item> items = __items(selectFields);
//		for(Item item : items){
//			if(filter.doFilter(item)){
//				item.setSelected(true);
//			}
//		}
//		return items;
//	}
//
//	@Override
//	public List<Node> nodes(ItemSelectedFilter filter) {
//		return __nodes(DEFAULT_SELECT_FIELDS, filter);
//	}
//
//	@Override
//	public List<Node> nodes(String selectFields, ItemSelectedFilter filter) {
//		return __nodes(selectFields, filter);
//	}
//
//	public List<Node> __nodes(String selectFields, ItemSelectedFilter filter) {
////		List<Node> nodes = __nodes(selectFields);
////		Map<String, Node> tree = new HashMap<String, Node>();
////		for(Node node : nodes){
////			if(filter.doFilter(node)){
////				node.setChecked(true);
////			}
////			tree.put(node.getId(), node);
////		}
//
//		String ql = __merge(new StringBuilder("select new ").append(Node.class.getName()).append("(").append(selectFields).append(",x.parent.id) ")).toString();
//		List<Node> nodes = manager.resultList(Node.class, ql, parameters);
//		//整理一下，生成树
//		Map<String, Node> maps = new HashMap<String, Node>();
//		for(Node node : nodes){
//			if(filter.doFilter(node)){
//				node.setChecked(true);
//			}
//			maps.put(node.getId(), node);
//		}
//		return __nodes(nodes, maps);
//	}
//	
//	private List<Node> __nodes(List<Node> nodes, Map<String, Node> tree){
//		List<Node> tns = new ArrayList<Node>();
//		for(Node node : nodes){
//			String pid = node.getParentId();
//			if(null != pid){
//				Node parent = tree.get(pid);
//				if(null != parent){
//					if(null == parent.getChildren()){
//						parent.setChildren(new ArrayList<Node>());
//					}
//					parent.getChildren().add(node);
//				}else{//非根节点，但是找不到上级父节点；有可能父节点已经被删除，但没删除父节点下的子节点的情况
//					//TODO 如何处理这种情况？
//					tns.add(node);
//				}
//			}else{//表示在根节点下
//				tns.add(node);
//			}
//		}
//		return tns;
//	}
//
//	@Override
//	public List<AjaxNode> ajaxNodes(ItemSelectedFilter filter) {
//		return __ajaxNodes(DEFAULT_SELECT_FIELDS, filter);
//	}
//
//	@Override
//	public List<AjaxNode> ajaxNodes(String selectFields, ItemSelectedFilter filter) {
//		return __ajaxNodes(selectFields, filter);
//	}
//
//	public List<AjaxNode> __ajaxNodes(String selectFields, ItemSelectedFilter filter) {
//		List<AjaxNode> nodes = __ajaxNodes(selectFields);
//		for(AjaxNode node : nodes){
//			if(filter.doFilter(node)){
//				node.setChecked(true);
//			}
//		}
//		return nodes;
//	}
//}